Typ budowania CMAKE nie jest używany w Cmakelistach.txt
Mam problem z ustawieniem domyślnej konfiguracji kompilacji Na Release. W moich Cmakelistach.plik txt, ustawiłem CMAKE_BUILD_TYPE na górze pliku z:
#enable Release ALWAYS, configure vars
set(CMAKE_BUILD_TYPE Release)
set(EXECUTABLE_NAME "ParticleSimulator")
set(VERSION_MAJOR 0)
set(VERSION_MINOR 2)
Ale po zbudowaniu mojego projektu i otwarciu rozwiązania, zawsze jestem przedstawiony z trybem debugowania, w przeciwieństwie do tego, co określiłem w moim pliku CMakeLists. Co robię źle?
Spojrzałem na kilka innych pytań na tam, ale nie widziałem nic, co było specyficzne dla tego pytania.
A gist of the CMakeLists.txt .
3 answers
Istnieją dwa typy generatorów: jedno-i wielo-konfiguracyjne.
Pojedyncze konfiguracje
Generatory Makeopodobne: Unixowe pliki Makefile, NMAKE Makefiles, MinGW Makefiles ,...
Ustawiasz typ konfiguracji w kroku generowania:
cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
W tym przypadku etap budowania to zawsze debugowanie :
> cmake --build _builds/Debug
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Debug # `--config` ignored
/usr/bin/c++ -g ...
> cmake --build _builds/Debug --config Release # yep, ignored
/usr/bin/c++ -g ...
Multi-configuration
Generatory IDE: Visual Studio, Xcode
CMAKE_BUILD_TYPE
przy generowaniu krok jest ignorowany, zarówno:
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64"
I
> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64"
Będzie miał ten sam efekt:
Dzieje się tak dlatego, że wszystkie konfiguracje są wewnętrzne (np. _builds/msvc-opaque/Release
i _builds/msvc-opaque/Debug
czy coś takiego, nie ma znaczenia). Możesz użyć opcji --config
do przełączania:
> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...
Kontrola (?)
Tak, możesz. Po prostu zdefiniuj CMAKE_CONFIGURATION_TYPES :# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")
Default wyjście:
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done
Przepisz to:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64"
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release
-- Configuring done
Możesz nawet zdefiniować własny typ konfiguracji:
> cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64"
I zbudować:
Cmake --build _builds --config MyRelease
Bałagan (?)
Wcale nie, jeśli znasz sztuczkę :) oto jak zbudować / przetestować konfigurację w skrypcie / serwerze CI / instrukcjach budowania dokumentacji itp.:
> CONFIG=Debug
> cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE
> cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile
> (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile
Zły wzór
if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!!
set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user...
Dobrze one
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags")
Działa nieźle.
target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")
Dziękuję! :) Oszczędzasz dzień dla jednego programisty.
Działa dla mnie z Makefile, jestem szczęśliwy ...
Jakiś cytat z fajnej książki miłego faceta pewnie wiesz (podkreślenie moje):
Po co się kłopotać? Osób, które programują na różnych systemach lub używają wiele kompilatorów dba o to, bo jeśli nie, to są zmuszeni marnować czas znajdowanie i naprawianie niejasnych robaki. Ludzie, którzy twierdzą, że nie dbają o przenośność zazwyczaj tak robią, ponieważ używają tylko jednego systemu i czują, że może sobie pozwolić na postawę, że " język jest tym, co implementuje mój kompilator.’’ To jest wąski i krótkowzroczny widok. Jeśli twój program się powiedzie, to jest prawdopodobnie zostanie przeniesiony, więc ktoś będzie musiał znaleźć i naprawić problemy związane z funkcje zależne od implementacji. Ponadto programy często muszą być skompilowane z innymi kompilatorami dla tego samego systemu, a nawet przyszłe wydanie Twój ulubiony kompilator może robić pewne rzeczy inaczej niż obecny. Informatyka jest znacznie łatwiejsze do poznania i ograniczenia wpływu zależności implementacyjnych, gdy program jest napisany, a nie po to, by potem rozplątać bałagan.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-31 15:51:55
Możesz również użyć następującego fragmentu:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
"Default build type: RelWithDebInfo" FORCE)
endif()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-13 21:31:49
Istnieje możliwość, że jeden z podmodułów ustawił wartość CMAKE_BUILD_TYPE
w pamięci podręcznej, czyli:
SET(CMAKE_BUILD_TYPE Debug CACHE)
Co oznacza, że ta wartość będzie stale aktualizowana od tego punktu do końca uruchomienia konfiguracji.
Świetnym sposobem na śledzenie miejsca, w którym ta wartość się zmieniła jest użycie CMake ' s variable_watch. W głównym pliku CMakelists.txt
Dodaj następujący wiersz
variable_watch(CMAKE_BUILD_TYPE)
To wyświetli standardowy błąd przy każdym dostępie do tego zmienna. I aby dostać go do pliku dziennika, zrób coś w stylu:
cmake <your options> 2>variable_watch.log
Możesz zobaczyć coś w stylu:
CMake Debug Log at <...> / CMakeLists.txt: 184 (add_library): Zmienna "CMAKE_BUILD_TYPE" została uzyskana za pomocą READ_ACCESS z wartością "Debug".
Wtedy prawdopodobnie zobaczysz punkt(y), w którym CMAKE_BUILD_TYPE został po raz pierwszy zmieniony. A stąd będziesz znacznie bliżej namierzenia linii CMake.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-31 15:53:31